Skip to content

Add SSH worker support to Symphony Elixir#48

Merged
frantic-openai merged 4 commits intomainfrom
ssh-worker-support
Mar 11, 2026
Merged

Add SSH worker support to Symphony Elixir#48
frantic-openai merged 4 commits intomainfrom
ssh-worker-support

Conversation

@frantic-openai
Copy link
Collaborator

@frantic-openai frantic-openai commented Mar 11, 2026

Context

Symphony needs to run tickets on SSH workers, keep the live E2E reliable, and preserve correct remote path semantics.

TL;DR

Add SSH workers, Docker-backed SSH live E2E coverage, per-host caps, and correct worker-side ~ resolution.

Summary

  • Add SSH worker execution, remote workspace handling, and SSH app-server launch support in Elixir.
  • Add live E2E coverage for both local workers and SSH workers, with Docker-backed SSH workers by default.
  • Add an optional shared worker.max_concurrent_agents_per_host cap and document the SSH extension.
  • Keep workspace.root raw so SSH workers resolve ~ on the worker, while local paths expand at local use sites.

Alternatives

  • Keep expanding workspace.root in config and carry duplicate raw path state, but that complicates the config model.
  • Require only absolute remote workspace roots, but that makes real worker setup less ergonomic and less representative.

Test Plan

  • make -C elixir all
  • cd elixir && env -u SYMPHONY_LIVE_SSH_WORKER_HOSTS LINEAR_API_KEY="$(tr -d '\r\n' < ~/.linear_api_key)" SYMPHONY_RUN_LIVE_E2E=1 mix test test/symphony_elixir/live_e2e_test.exs:128

frantic-openai and others added 4 commits March 10, 2026 19:13
Summary:
- add SSH worker execution support, host selection, and remote
  workspace/app-server wiring for Symphony Elixir
- add Docker-backed SSH workers plus explicit local and SSH live E2E
  coverage in the Elixir test suite
- simplify workflow worker config and document the new E2E behavior

Rationale:
- let Symphony run Codex work on remote SSH hosts without hardcoding
  host-specific config into the repo
- make the live test exercise both the baseline local path and the
  SSH worker path with disposable infrastructure by default
- keep the test and config surface smaller by removing unnecessary
  normalization and Docker-specific overrides

Tests:
- make all
- env -u SYMPHONY_LIVE_SSH_WORKER_HOSTS LINEAR_API_KEY="$(tr -d '\r\n' < ~/.linear_api_key)" SYMPHONY_RUN_LIVE_E2E=1 mix test test/symphony_elixir/live_e2e_test.exs

Co-authored-by: Codex <codex@openai.com>
Summary:
- add an optional worker.max_concurrent_agents_per_host setting to the
  Elixir workflow schema
- update orchestrator host selection to skip SSH hosts that are at the
  shared per-host cap and wait when all SSH hosts are full
- cover the new cap in config, scheduler, and spec documentation tests

Rationale:
- let operators bound concurrent ticket execution per SSH worker
  machine without introducing per-host bespoke config
- keep scheduling behavior predictable by treating saturated SSH hosts
  as temporarily unavailable instead of falling back to local execution
- document the feature lightly in the spec so the extension is visible
  without overspecifying implementation details

Tests:
- make all

Co-authored-by: Codex <codex@openai.com>
Summary:
- add an appendix describing the optional SSH worker extension
- clarify the execution model, scheduling notes, and operator concerns
- call out failover, workspace locality, and host-capacity behavior

Rationale:
- document the SSH extension in one place without over-specifying the
  implementation
- make the main operational tradeoffs explicit for readers and operators

Tests:
- not run (doc-only change)

Co-authored-by: Codex <codex@openai.com>
Summary:
- keep workspace.root as the configured string instead of expanding it in
  config parsing
- expand local workspace roots only at local sandbox/path use sites and keep
  ssh roots raw for worker-side ~ resolution
- update the ssh workspace tests and live e2e harness to exercise remote
  roots that begin with ~
- stabilize the orchestrator polling snapshot test under coverage timing

Rationale:
- preserve the correct ownership boundary for remote path interpretation so
  ssh workers resolve ~ using their own HOME
- avoid carrying duplicate config state such as raw_root when the consumers
  can handle expansion at the actual boundary
- keep make all green while changing the path semantics by tightening the
  affected tests

Tests:
- make -C elixir all
- cd elixir && env -u SYMPHONY_LIVE_SSH_WORKER_HOSTS LINEAR_API_KEY="$(tr -d '\r\n' < ~/.linear_api_key)" SYMPHONY_RUN_LIVE_E2E=1 mix test test/symphony_elixir/live_e2e_test.exs:128

Co-authored-by: Codex <codex@openai.com>
@frantic-openai frantic-openai merged commit ff65c7c into main Mar 11, 2026
3 checks passed
@frantic-openai frantic-openai deleted the ssh-worker-support branch March 11, 2026 21:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant